﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
using User.EF.Contracts;
using User.EF.Model;
using User.Global.Contracts.Message;
using User.Global.Resources;
using User.Web.Common.WebAttributes;
using User.Web.Contracts.Model.Admin;
using User.Web.Models.Helper;

namespace User.Web.Models.Admin
{
    /// <summary>
    /// Model nur zum Anzeigen der MemberDetails
    /// </summary>
    public class MemberEditAdminModel : ModelBase, IMemberEditAdminModel
    {
        #region Member
        /// <summary>
        /// MemberTitle, bei Listen wird nur der Getter gesetzt, für den Value selbst gibt es noch ein extra Property
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Title")]
        public IEnumerable<SelectListItem> MemberTitles
        {
            get
            {
                TitleHelper helper = new TitleHelper();
                return helper.GetTitles();
            }
        }

        /// <summary>
        /// Die Anrede die in der Oberfläche ausgewählt wird (der Value) wird in dieser variable abgelegt, d.h. wenn kein Wert ausgewählt wurde
        /// dann wird auch die hier angegebene Fehlermeldung auf der Oberfläche angezeigt. Wird auch benutzt um die currentselection der Dropdownliste anzuzeigen,
        /// da das Property Selected des SelectedListItem nicht funktioniert!
        /// ACHTUNG der Propertyname darf nicht Title sein, da sonst die Validierung nicht funktioniert!
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Title")]
        public string MemberTitle { get; set; }

        /// <summary>
        /// der Vorname des Members
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Firstname")]
        [HtmlAttributes(CssClass = "form-control", Placeholder = "Vorname", MaxLength = 50)]
        public string Firstname { get; set; }
        
        /// <summary>
        /// Der Nachname des Members
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Lastname")]
        [HtmlAttributes(CssClass = "form-control", Placeholder = "Nachname", MaxLength = 50)]
        public string Lastname { get; set; }
        
        /// <summary>
        /// Der Loginname (E-Mail) des Members
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Username")]
        public string Username { get; set; }
        
        /// <summary>
        /// Die ID des Members im System
        /// </summary>
        public long Id { get; set; }
        
        /// <summary>
        /// Gibt an ob der Account noch aktiviert ist oder deaktiviert wurde.
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "IsActiveAccount")]
        [HtmlAttributes(CssClass = "form-control")]
        public bool IsActiveAccount { get; set; }

        /// <summary>
        /// Die Telefonnumer des Members
        /// </summary>
        [Display(ResourceType = typeof(InputFieldNames), Name = "Phone")]
        [HtmlAttributes(CssClass = "form-control", Required = true, Placeholder = "Telefon", MaxLength = 50)]
        public string Mobilenumber { get; set; }
        #endregion

        #region Initialize
        public MemberEditAdminModel()
        {
            Id = 0;
            Firstname = string.Empty;
            Lastname = string.Empty;
            Username = string.Empty;
            IsActiveAccount = false;
            Mobilenumber = string.Empty;
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Laden der passenden Modeldaten für den View.
        /// </summary>
        /// <returns>TRUE->Laden der Daten erfolgreich | FALSE->Fehler beim Laden der Daten</returns>
        public bool Load(IWebQuerySummary webQuery, long userId)
        {
            //Unseren User laden
            Member member = webQuery.MembershipQueries.GetMemberById(userId);
            if (member != null)
            {
                Id = member.Id;
                Username = member.Username;
                MemberTitle = member.MemberExtension != null ? member.MemberExtension.Title.ToString() :ETitle.None.ToString();
                Firstname = member.MemberExtension != null ? member.MemberExtension.Firstname : DefaultMessages.KeinAngabe;
                Lastname = member.MemberExtension != null ? member.MemberExtension.Lastname : DefaultMessages.KeinAngabe;
                Mobilenumber = member.MemberExtension != null ? member.MemberExtension.Mobilenumber : DefaultMessages.KeinAngabe;
                IsActiveAccount = member.IsActive;
                return true;
            }

            AddMessage.Add(ErrorMessages.UserDontExists, MessageTypes.error);
            return false;
        }

        /// <summary>
        /// Speichern der passenden Modeldaten aus dem View.
        /// </summary>
        /// <returns>TRUE->Laden der Daten erfolgreich | FALSE->Fehler beim Laden der Daten</returns>
        public bool Save(IWebQuerySummary webQuery, long userId)
        {
            //Unseren User laden
            Member member = webQuery.MembershipQueries.GetMemberById(userId);
            if (member != null)
            {
                if (member.MemberExtension == null)
                {
                    member.MemberExtension = new MemberExtension();
                }

                //Die passenden Userdaten setzten.
                member.MemberExtension.Firstname = Firstname;
                member.MemberExtension.Lastname = Lastname;
                member.MemberExtension.Mobilenumber = Mobilenumber;
                member.MemberExtension.Title = (ETitle) Enum.Parse(typeof (ETitle), MemberTitle);
                member.IsActive = IsActiveAccount;

                if (webQuery.Save())
                {
                    AddMessage.Add(DefaultMessages.SavesuccessFull, MessageTypes.ok);
                    return true;
                }

                AddMessage.Add(ErrorMessages.UserSaveError, MessageTypes.error);
                return false;
            }

            AddMessage.Add(ErrorMessages.UserDontExists, MessageTypes.error);
            return false;
        }
        #endregion
    }
}
